#pragma once

#include "glog/logging.h"
#include <atomic>
#include <mutex>

class  control_node
{
private:
    std::mutex _data_mtx;
    double _x_data;
    double _y_data;
    double _z_data;
    double _w_data;
public:
     control_node ():_x_data(0.0),_y_data(0.0),_z_data(0.0),_w_data(0.0){};
    ~control_node () {};

    void set_data(double x, double y, double z, double w)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _x_data = x;
        _y_data = y;
        _z_data = z;
        _w_data = w;
    }

    void add_data(double x, double y, double z, double w)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _x_data += x;
        _y_data += y;
        _z_data += z;
        _w_data += w;
    }

    // 设置_x_data的值
    void set_x_data(double x)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _x_data = x;
    }

    void add_x_data(double x)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _x_data += x;
    }

    // 设置_y_data的值
    void set_y_data(double y)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _y_data = y;
    }

    void add_y_data(double y)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _y_data += y;
    }

    // 设置_z_data的值
    void set_z_data(double z)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _z_data = z;
    }

    void add_z_data(double z)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _z_data += z;
    }

    // 设置_w_data的值
    void set_w_data(double w)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _w_data = w;
    }

    void add_w_data(double w)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        _w_data += w;
    }

    // 获取数据成员的值
    void get_data(double &x, double &y, double &z, double &w)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        x = _x_data;
        y = _y_data;
        z = _z_data;
        w = _w_data;
    }

    // 获取_x_data的值
    void get_x_data(double &x)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        x = _x_data;
    }
    // 获取_y_data的值
    void get_y_data(double &y)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        y = _y_data;
    }
    // 获取_z_data的值
    void get_z_data(double &z)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        z = _z_data;
    }
    // 获取_w_data的值
    void get_w_data(double &w)
    {
        // 加锁
        std::lock_guard<std::mutex> lock(_data_mtx);
        w = _w_data;
    }

};

